import numpy as np
from sklearn.decomposition import PCA
from sklearn.model_selection import train_test_split
from sklearn.neural_network import MLPClassifier
from sklearn.metrics import precision_score, recall_score, f1_score

# load
x = np.loadtxt(r'../../../../../large_data/finalX/PEPX.txt', delimiter=',')
m = len(x)
y = np.loadtxt(r'../../../../../large_data/finalX/PEPL.txt', delimiter=',')

# 20　降维后的新特征包含原始特征75%的主成分   3分
dc = PCA(0.75)
x = dc.fit_transform(x)

# 21　输出降维后的方差和方差贡献率  4分   若有一处错误 该问0分
v1 = dc.explained_variance_
v2 = x.var(axis=0)
print(f'v1 == v2: {np.allclose(v1, v2)}')
print(f'x.var:{v2}')
print(f'降维后的方差:{v1}')  # ATTENTION
print(f'降维后的方差贡献率:{dc.explained_variance_ratio_}')  # ATTENTION

# 22　特征缩放，对新特征集和标签Y进行打乱次序 、对数据集切分，训练集占60%，测试集占40%    4分   （若有一处错误 该问0分。）
mu = x.mean(axis=0)
sigma = x.std(axis=0)
x -= mu
x /= sigma
x_train, x_test, y_train, y_test = train_test_split(x, y, train_size=0.6, random_state=1)

# 23　引入模型训练，2个隐藏层，第一个隐藏层200个神经元，第二个隐藏层100个神经元  最大迭代次数200    4分   （若有一处错误 该问0分。）
clf = MLPClassifier(hidden_layer_sizes=[200, 100], max_iter=200, alpha=0.1)
clf.fit(x_train, y_train)
print(f'Training score = {clf.score(x_train, y_train)}')

# 24　输出测试集上的precision、recall、f1-score    4分  若有一处错误 该问0分。
h_test = clf.predict(x_test)
print(f'测试集上的precision:{precision_score(y_test, h_test, average="micro")}')
print(f'测试集上的recall:{recall_score(y_test, h_test, average="micro")}')
print(f'测试集上的f1-score:{f1_score(y_test, h_test, average="micro")}')
